package leetCode;

import java.util.*;

/**
 * 1200. 最小绝对差
 *
 给你个整数数组arr，其中每个元素都 不相同。

 请你找到所有具有最小绝对差的元素对，并且按升序的顺序返回。

 示例 1：
 输入：arr = [4,2,1,3]
 输出：[[1,2],[2,3],[3,4]]

 示例 2：
 输入：arr = [1,3,6,10,15]
 输出：[[1,3]]

 示例 3：
 输入：arr = [3,8,-10,23,19,-4,-14,27]
 输出：[[-14,-10],[19,23],[23,27]]

 提示：
 2 <= arr.length <= 10^5
 -10^6 <= arr[i] <= 10^6
 */
public class MinimumAbsoluteDifference {
    public static void main(String[] args) {

    }

    //哈希记录差值，21/85
    public List<List<Integer>> minimumAbsDifference(int[] arr) {
        Arrays.sort(arr);
        Map<Integer, ArrayList> res = new HashMap();
        int min = 1000;
        for (int i = 1; i < arr.length; i++) {
            int cha = arr[i] - arr[i-1];
            if (min < cha) {
                continue;
            } else {
                List list = new ArrayList();
                list.add(arr[i-1]);
                list.add(arr[i]);
                if (res.containsKey(cha)) {
                    res.get(cha).add(list);
                } else {
                    res.put(cha,new ArrayList() {
                        {
                            add(list);
                        }
                    });
                }
                min = cha;
            }
        }
        return res.get(min);
    }

    public List<List<Integer>> minimumAbsDifference2(int[] arr) {
        return new java.util.AbstractList<List<Integer>>() {
            private int[] buffer;
            private int size;
            private boolean initialed;
            private int min = Integer.MAX_VALUE;
            private void init() {
                if (initialed) {
                    return;
                }
                buffer = new int[arr.length];
                Arrays.sort(arr);
                for (int i = 1; i < arr.length; i++) {
                    int diff = arr[i] - arr[i - 1];
                    if (diff > min) {
                        continue;
                    } else if (diff < min) {
                        size = 0;
                        min = diff;
                    }
                    buffer[size++] = arr[i - 1];
                }
                initialed = true;
            }
            @Override
            public List<Integer> get(int index) {
                init();
                return Arrays.asList(buffer[index], buffer[index] + min);
            }

            @Override
            public int size() {
                init();
                return size;
            }
        };
    }

    public List<List<Integer>> minimumAbsDifference3(int[] arr) {
        Arrays.sort(arr);
        int d=(int)1e7;
        for(int i=1;i<arr.length;i++){
            d = Math.min(d,arr[i]-arr[i-1]);
        }
        List<List<Integer>> ans = new ArrayList<>();
        for(int i=1;i<arr.length;i++){
            if(arr[i]-arr[i-1]==d){
                ans.add(Arrays.asList(new Integer[]{arr[i-1],arr[i]}));
            }
        }
        return ans;
    }
}
